package com.qf.filters;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;



// 前置过滤器 在转发在请求之前执行 比如可以判断权限等等
@Component
public class MyPreFilter extends ZuulFilter {

//    过滤器类型
    @Override
    public String filterType() {
//        前置
        return FilterConstants.PRE_TYPE;
    }
//      过滤器顺序 过滤器的顺序,数字越小优先级越高,但是仅仅局限于同等类型的过滤器,不同类型的过滤器会先按照类型进行顺序划分,比如前置过滤器数字再大也比后置过滤器先执行
    @Override
    public int filterOrder() {
        return 1;
    }

// 是否执行当前方法
//    可以动态通过代码 来控制 返回值 是否执行开启当前方法
    @Override
    public boolean shouldFilter() {

//        Random random=new Random();
//        int i=random.nextInt(10);
//        return i%2==0;
        return true;

    }

//    要执行的方法
    @Override
    public Object run() throws ZuulException {
        System.out.println("MyPreFilter01 执行了");
////        当前过滤器是前置过滤器  意思可以拦截请求直接返回结果
//
//        通过threadlocal  来保存请求对象      threadlocal一般是一个静态变量
//        RequestContext context = RequestContext.getCurrentContext();


//        HttpServletRequest request = context.getRequest();
//
////      为什么前置过滤器中可以获取响应对象 第一当前 的 响应对象是网关的 是用于响应客户端的 并不是下游服务的响应对象
////        第二 响应 对象是请求达到的时候 Tomcat就创建好了  方便我们通过这个对象返回结果
//        HttpServletResponse response = context.getResponse();
//
//        试一下  拦截请求返回结果
//      这个方法并不是真正的拦截请求 而是我们在这边设置值之后可以让后面的过滤器获取结果 是否执行过滤器   变相达到拦截的效果
//        设置 ture  或者false  只是让 后面 过滤器获取结果是否执行
//        context.setSendZuulResponse(false);
//        try {
//            response.setHeader("content-Type","text/html;charset=utf-8");
//            response.getWriter().write("随便写的");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

//        设置响应正文
//        如果通过getwrite 返回了结果 当前方法会报错 因为 已经执行过getwriter了
//        context.setResponseBody("这是啥啊");


        return null;
    }
}
